import {
  reactive/** ←可以把一个对象变成响应式的*/
  , effect /** ←effect里使用的变量如果发生变化,这个effect会默认重新执行*/
  , computed /** ←计算属性*/
  , ref /** ←*/

  //watchEffect 基于effect, 使用了批量更新策略
} from './reactivity';

const state = reactive({name: 'ahhh', age: 123, arr:[1,2,3]});

state.arr.push(4);
/*
baseHandlers.js:11 用户对这个对象取值了 {name: "ahhh", age: 123, arr: Array(3)} arr
baseHandlers.js:11 用户对这个对象取值了 (3) [1, 2, 3] push
baseHandlers.js:11 用户对这个对象取值了 (3) [1, 2, 3] length
baseHandlers.js:25 对这个对象进行了设置值 (4) [1, 2, 3, 4] 3 ←←← 给第三个索引设置了值
baseHandlers.js:26 target.length: 4
baseHandlers.js:25 对这个对象进行了设置值 (4) [1, 2, 3, 4] length ←←← 更新了数组的length属性
baseHandlers.js:26 target.length: 4
* */
/** ↑ 这里push了一个值 但触发了两次set, 因为它会先往数组中插入值,随后再更新length
 * 但更新length其实是无意义的, 因为长度在第一次set时就已经同步了
 *
 * So 我们应该在set里判断一下 是修改属性 还是增加属性
 * 如果是修改
 * 并且原来的值和新设置的一样 就什么都不做*/
